import requests
import re
from urllib.parse import quote
from pprint import pprint
import mwparserfromhell

#from resolve_music_content import *

def get_final_content(pageid, max_redirects=5):
    """
    获取页面内容，自动处理重定向
    :param pageid: 初始页面ID
    :param max_redirects: 最大重定向次数(防止循环)
    :return: (最终内容, 最终pageid, 错误信息)
    """
    visited = set()  # 记录已访问的pageid防止循环
    
    while max_redirects > 0:
        if pageid in visited:
            return None, None, "检测到重定向循环"
        visited.add(pageid)
        
        # 获取页面数据（启用redirects参数让API自动处理重定向）
        url = f"https://vcpedia.cn/api.php?action=query&prop=revisions&pageids={pageid}&rvprop=content&redirects&format=json"
        response = requests.get(url)
        data = response.json()
        
        # 获取实际的页面数据（可能已重定向）
        pages = data.get('query', {}).get('pages', {})
        if not pages:
            return None, None, None, "未获取到页面数据"
        
        # 获取当前有效的pageid（可能是重定向后的新id）
        current_pageid = next(iter(pages))
        page_data = pages[current_pageid]
        
        # 检查页面是否存在
        if 'missing' in page_data:
            return None, None, None, "页面不存在"
        
        # 检查是否是重定向页面（即使API自动跳转，内容可能仍是重定向指令）
        if 'revisions' in page_data:
            title = page_data['title']
            content = page_data['revisions'][0]['*']
            if is_redirect(content):
                target = get_redirect_target(content)
                if target:
                    # 获取重定向目标的pageid
                    new_pageid = get_pageid_by_title(target)
                    if new_pageid:
                        pageid = new_pageid
                        max_redirects -= 1
                        continue
                    return None, None, None, f"无法找到重定向目标: {target}"
                return None, None, None, "无效的重定向格式"
            
            # 返回最终内容和最终pageid
            return title, content, current_pageid, None
    
    return None, None, "达到最大重定向次数"

def is_redirect(content):
    """检查是否是重定向页面"""
    return content and content.startswith(('#REDIRECT', '#redirect'))

def get_redirect_target(content):
    """从重定向内容中提取目标页面标题"""
    match = re.match(r'#REDIRECT\s*\[\[([^\]\|]+)', content, re.IGNORECASE)
    return match.group(1).strip() if match else None

def get_pageid_by_title(title):
    """根据标题获取pageid"""
    url = f"https://vcpedia.cn/api.php?action=query&titles={quote(title)}&format=json"
    response = requests.get(url)
    data = response.json()
    
    pages = data.get('query', {}).get('pages', {})
    if pages:
        pageid = next(iter(pages))
        return int(pageid) if pageid != '-1' else None
    return None


def extract_infobox(template):
    params = {}
    for param in template.params:
        # 参数名可能包含空格，使用 strip() 处理
        param_name = str(param.name).strip()
        param_value = str(param.value).strip()
        
        
        # 处理特殊格式的值
        if "{{BilibiliCount" in param_value:
            # 提取 BilibiliCount 模板中的 ID
            match = re.search(r'\{\{BilibiliCount\|id=(\w+)\}\}', param_value)
            if match:
                params[param_name] = f"av{match.group(1)}"
            else:
                params[param_name] = param_value
        else:
            params[param_name] = param_value
    

    return params

def extract_lyrics_clean(wikitext):
    wikicode = mwparserfromhell.parse(wikitext)
    
    # 查找所有二级标题
    for heading in wikicode.filter_headings():
        if str(heading.title).strip() == "歌词" and heading.level == 2:
            # 获取标题后所有内容直到下一个二级标题
            nodes = []
            start_index = wikicode.index(heading) + 1
            for node in wikicode.nodes[start_index:]:
                if isinstance(node, mwparserfromhell.nodes.heading.Heading) and node.level == 2:
                    break
                nodes.append(node)
            
            lyrics_wikicode = mwparserfromhell.wikicode.Wikicode(nodes)
            
            # 尝试解析LyricsKai模板
            for template in lyrics_wikicode.filter_templates():
                if template.name.strip().lower() == 'lyricskai':
                    # 提取原文和译文
                    original = template.get('original', None)
                    translated = template.get('translated', None)
                    
                    # 清理并组合文本
                    lyrics_text = ""
                    if original:
                        lyrics_text += str(original) + "\n\n"
                    if translated:
                        lyrics_text += str(translated)
                    
                    if lyrics_text:
                        # 移除所有ref标签
                        lyrics_text = re.sub(r'<ref[^>]*>.*?</ref>', '', lyrics_text, flags=re.DOTALL)
                        lyrics_text = re.sub(r'<ref[^>]*/>', '', lyrics_text)
                        
                        # 转换wikitext为纯文本
                        clean_wikicode = mwparserfromhell.parse(lyrics_text)
                        plaintext = clean_wikicode.strip_code()
                        
                        # 清理空行和多余空格
                        plaintext = "\n".join(
                            line.strip() 
                            for line in plaintext.splitlines() 
                            if line.strip()
                        )
                        return plaintext
            
            # 新增加的处理方案：处理<poem>标签内容
            for tag in lyrics_wikicode.filter_tags():
                if tag.tag.lower() == 'poem':
                    # 提取<poem>标签内的内容
                    poem_content = tag.contents
                    
                    # 处理颜色模板
                    lyrics_text = str(poem_content)
                    
                    # 移除颜色模板但保留文本
                    lyrics_text = re.sub(r'\{\{color\|[^|]+\|([^}]+)\}\}', r'\1', lyrics_text)
                    
                    # 移除所有ref标签
                    lyrics_text = re.sub(r'<ref[^>]*>.*?</ref>', '', lyrics_text, flags=re.DOTALL)
                    lyrics_text = re.sub(r'<ref[^>]*/>', '', lyrics_text)
                    
                    # 转换wikitext为纯文本
                    clean_wikicode = mwparserfromhell.parse(lyrics_text)
                    plaintext = clean_wikicode.strip_code()
                    
                    # 清理空行和多余空格
                    plaintext = "\n".join(
                        line.strip() 
                        for line in plaintext.splitlines() 
                        if line.strip()
                    )
                    return plaintext
            
            # 备用方案：直接处理整个歌词部分
            lyrics_text = str(lyrics_wikicode)
            lyrics_text = re.sub(r'<ref[^>]*>.*?</ref>', '', lyrics_text, flags=re.DOTALL)
            lyrics_text = re.sub(r'<ref[^>]*/>', '', lyrics_text)
            clean_wikicode = mwparserfromhell.parse(lyrics_text)
            plaintext = clean_wikicode.strip_code()
            plaintext = "\n".join(line.strip() for line in plaintext.splitlines() if line.strip())
            return plaintext
    
    return None
    
    return None


def extract_staff_comments(wikitext):
    """提取并清理STAFF的話部分的内容"""
    wikicode = mwparserfromhell.parse(wikitext)
    
    # 查找所有二级标题
    for heading in wikicode.filter_headings():
        title = str(heading.title).strip()
        if title == "STAFF的話" and heading.level == 2:
            # 获取标题后所有内容直到下一个二级标题
            nodes = []
            start_index = wikicode.index(heading) + 1
            for node in wikicode.nodes[start_index:]:
                if isinstance(node, mwparserfromhell.nodes.heading.Heading) and node.level == 2:
                    break
                nodes.append(node)
            
            staff_wikicode = mwparserfromhell.wikicode.Wikicode(nodes)
            
            # 查找Cquote模板
            for template in staff_wikicode.filter_templates():
                if template.name.strip().lower() == 'cquote':
                    # 提取模板内容
                    quote_content = template.get(1)  # 第一个参数是引用内容
                    if quote_content:
                        quote_text = str(quote_content)
                        
                        # 提取<poem>标签内容
                        poem_match = re.search(r'<poem>(.*?)</poem>', quote_text, re.DOTALL)
                        if poem_match:
                            poem_content = poem_match.group(1)
                            
                            # 清理内容
                            clean_content = clean_poem_content(poem_content)
                            
                            # 提取签名
                            signature = template.get(2)  # 第二个参数是签名
                            if signature:
                                signature_text = clean_signature(str(signature))
                                clean_content += f"\n\n——{signature_text}"
                            
                            return clean_content
            # 如果没找到模板，直接返回整个部分
            return clean_wikitext_text(str(staff_wikicode))
    
    return None  # 如果未找到STAFF的話部分

def clean_poem_content(text):
    """清理poem标签内的内容"""
    # 移除HTML注释
    text = re.sub(r'<!--.*?-->', '', text, flags=re.DOTALL)
    
    # 移除换行符前后的多余空格
    text = re.sub(r'[ \t]*\n[ \t]*', '\n', text)
    
    # 移除每行开头和结尾的空格
    text = "\n".join(line.strip() for line in text.splitlines())
    
    return text

def clean_signature(text):
    """清理签名文本"""
    # 移除粗体标记
    text = re.sub(r"'''(.*?)'''", r'\1', text)
    
    # 移除多余空格
    text = text.strip()
    
    return text

def clean_wikitext_text(text):
    """通用维基文本清理"""
    # 移除模板
    text = re.sub(r'\{\{.*?\}\}', '', text, flags=re.DOTALL)
    
    # 移除标签
    text = re.sub(r'<.*?>', '', text, flags=re.DOTALL)
    
    # 移除HTML注释
    text = re.sub(r'<!--.*?-->', '', text, flags=re.DOTALL)
    
    # 清理多余空格和空行
    text = re.sub(r'\n{3,}', '\n\n', text)
    text = re.sub(r'[ \t]{2,}', ' ', text)
    
    return text.strip()

def extract_introduction_clean(wikitext):
    """提取并清理简介部分的纯文本内容"""
    wikicode = mwparserfromhell.parse(wikitext)
    
    # 查找所有二级标题
    for heading in wikicode.filter_headings():
        if str(heading.title).strip() == "简介" and heading.level == 2:
            # 获取标题后所有内容直到下一个二级标题
            nodes = []
            start_index = wikicode.index(heading) + 1
            for node in wikicode.nodes[start_index:]:
                if isinstance(node, mwparserfromhell.nodes.heading.Heading) and node.level == 2:
                    break
                nodes.append(node)
            
            intro_wikicode = mwparserfromhell.wikicode.Wikicode(nodes)
            
            # 清理内容
            return clean_introduction_text(str(intro_wikicode))
    
    return None  # 如果未找到简介部分

def clean_introduction_text(text):
    """清理简介文本中的维基标记"""
    # 处理黑幕模板 {{黑幕|内容}} → 内容
    text = re.sub(r'\{\{黑幕\|([^}]+)\}\}', r'\1', text)
    
    # 处理bilibiliCount模板 {{bilibiliCount|id=xxx}} → 空
    bili_pattern = r'，?截至(?:現在|现在)已有\{\{[Bb]ilibiliCount.*?\}\}次观看，\{\{[Bb]ilibiliCount.*?\}\}人收藏[。]?'
    text = re.sub(bili_pattern, '', text, flags=re.DOTALL)
    
    # 移除链接标记 [[文本]] → 文本
    text = re.sub(r'\[\[([^|\]]+?)(?:\|([^\]]+))?\]\]', lambda m: m.group(2) or m.group(1), text)
    
    # 移除粗体标记 '''文本''' → 文本
    text = re.sub(r"'''(.*?)'''", r'\1', text)
    
    # 移除其他维基标记
    clean_wikicode = mwparserfromhell.parse(text)
    plaintext = clean_wikicode.strip_code()
    
    # 清理多余空格和空行
    plaintext = re.sub(r'\n{3,}', '\n\n', plaintext)  # 多个空行合并为一个
    plaintext = re.sub(r'[ \t]{2,}', ' ', plaintext)  # 多个空格合并为一个
    plaintext = plaintext.strip()
    
    return plaintext


if __name__=="__main__":
    # 使用示例
    #title, content, final_pageid, error = get_final_content(2878)  # 歌曲:镜花水月
    #title, content, final_pageid, error = get_final_content(52640)  # 歌曲:独占春
    #title, content, final_pageid, error = get_final_content(3349)  # 歌曲:平行
    #title, content, final_pageid, error = get_final_content(5140)  # 歌曲:一言即中
    #title, content, final_pageid, error = get_final_content(4465)  # 歌曲:玉粽袭香
    #title, content, final_pageid, error = get_final_content(3960)  # 歌曲:我家的天空没法下雨
    #title, content, final_pageid, error = get_final_content(2585)  # 歌曲:告白气球
    #title, content, final_pageid, error = get_final_content(5946)  # 歌曲:从黑暗，到光明
    #title, content, final_pageid, error = get_final_content(3987)  # 歌曲:我想在你的心脏里起舞


    title, content, final_pageid, error = get_final_content(12402)  # 歌曲:世末歌者
    if error:
        print(f"错误: {error}")
    else:
        print(f"最终pageid: {final_pageid}")
        print(f"标题: {title}")
        #print(f"内容: \n{content}")

    parsed = mwparserfromhell.parse(content)
    
    infoboxes = parsed.filter_templates(matches="VOCALOID_Songbox")
    #print(infoboxes)
    print("\n"*3+"歌曲信息:")
    for infobox in infoboxes:
        
        song_info = extract_infobox(infobox)
        pprint(song_info)

    print("\n"*3+"歌词:")
    lrc=extract_lyrics_clean(content)
    print(lrc)

    print("\n"*3+"简介:")
    introduction=extract_introduction_clean(content)
    print(introduction)

    print("\n"*3+"staff的话:")
    staff_comments = extract_staff_comments(content)
    print(staff_comments)